package com.leetcode.support;

import com.google.common.collect.Sets;

import java.util.HashSet;
import java.util.Set;

public class Utils {

    /**
     * 计算两个数组的交集
     */
    public static Set<Integer> intersection(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums1) {
            set.add(num);
        }

        Set<Integer> resultSet = new HashSet<>();
        for (int num : nums2) {
            if (set.contains(num)) {
                resultSet.add(num);
            }
        }

        // guava 种的计算交集，差集，并集
        Set<Integer> a = Sets.intersection(set, resultSet);
        Set<Integer> b = Sets.difference(set, resultSet);
        Set<Integer> c = Sets.union(set, resultSet);

        return resultSet;
    }

    /**
     * 两个整数最大公约数求法
     *
     * @param a 整数1
     * @param b 整数2
     * @return 最大公约数
     */
    public static int gcd(int a, int b) {
        return a < b ? gcd(b, a) : a % b == 0 ? b : gcd(b, a % b);
    }

    /**
     * 交换两个数字变量 a 和 b
     * 没有临时变量的参与
     * 任何一个数异或自身都等于0，任何一个数异或0都等于自身
     */
    public static int[] exchangeNum(int a, int b) {
        int[] res = new int[2];
        a = a ^ b; // 让一个变量先变为异或结果
        b = a ^ b; // 相当于最初的 a ^ b ^ b --> a ^ 0 --> a
        a = a ^ b; // 相当与后来的 a 异或最初的 a , a ^ b ^ a --> b
        res[0] = a;
        res[1] = b;
        return res;
    }

}
